package java学习.第18章_JDK8_17新特性;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Supplier;

/**
 * {@link java.util.stream.Stream#collect(Supplier, BiConsumer, BiConsumer)}
 *
 * Supplier<R> supplier,
 * 第一个函数生成一个  **新的对象**（如ArrayList）（最后返回的也是这个）
 *
 * BiConsumer<R, ? super T> accumulator,
 * 第二个函数的第一个参数是前面生成的对象（如ArrayList），第二个参数是stream中包含的元素，
 * 函数体就是把stream中的元素加入对象中（如ArrayList）。第二个方法被反复调用直到原stream的元素被消费完毕；
 *
 * BiConsumer<R, R> combiner
 * 第三个函数也是接受两个参数，这两个都是ArrayList类型的，第一个参数是第一个函数创建的list，
 * 第二个参数，由于在并行的时候会创建多个List存储并行时各个线程所计算完的结果，
 * 应该是一个线程对应一个List存储结果，每个线程都会调用第二个函数进行消费当前线程所需要处理的数据，
 * 如果创建了N个线程，那么就会有N个结果，然后这些结果就一个一个传进第三个函数的第二个参数。
 *
 */
public class CA_StreamAPI中collect详解 {

    private static List<User> List数组2() {
        List<User> list = new ArrayList<>();
        list.add(new User(1001, "马化腾", 34,Arrays.asList("1","11","111")));
        list.add(new User(1002, "马云", 12,Arrays.asList("2","22","222")));
        list.add(new User(1003, "刘强东", 33,Arrays.asList("3","33","333")));
        list.add(new User(1004, "雷军", 26,Arrays.asList("4","44","444")));
        list.add(new User(1005, "李彦宏", 65,Arrays.asList("5","55","555")));
        list.add(new User(1006, "比尔盖茨", 42,Arrays.asList("6","66","666")));
        list.add(new User(1007, "任正非", 26,Arrays.asList("7","77","777")));
        list.add(new User(1008, "扎克伯格", 35,Arrays.asList("8","88","888")));
        return list;
    }
    @Test
    public  void Stream之collect() {
        List<User> users = List数组2();
        List<String> collect = users.parallelStream()
                .map(User::getList)
//                .collect(ArrayList::new, List::addAll, List::addAll);
                .collect(MyList::new, List::addAll, List::addAll);
        System.out.println(collect);
        System.out.println("-----------------");
        System.out.println(users);
    }
}
class MyList extends ArrayList<String>{
    public MyList(){
        System.out.println("创建了");
    }

}
